package br.com.hs.nfe.common.to;

import br.com.hs.nfe.common.anotation.DocumentTypeEnum;
import br.com.hs.nfe.common.anotation.Element;
import br.com.hs.nfe.common.anotation.Node;
import br.com.hs.nfe.common.anotation.TypeEnum;
import br.com.hs.nfe.common.validation.Validable;
import br.inf.portalfiscal.nfe.TEndereco;

/**
 * Classe de dados do cliente da NFe.
 * @author Ranlive Hrysyk
 */
@Node(id = "E", name = "Cliente")
public class ClienteTO extends BaseTO implements Validable {

    @Element(elementName = "CNPJ", publicName = "CNPJ", type = TypeEnum.CARACTER, min = 14, max = 14, required = false, document= DocumentTypeEnum.CNPJ)
    private String cnpj;
    @Element(elementName = "CPF", publicName = "CPF", type = TypeEnum.CARACTER, min = 11, max = 11, required = false, document= DocumentTypeEnum.CPF)
    private String cpf;
    @Element(publicName = "Razão Social/Nome", type = TypeEnum.CARACTER, min = 2, max = 60)
    private String xNome;
    @Element(elementName = "enderDest", publicName = "Endereço", type = TypeEnum.NODE, classType = TEndereco.class)
    private EnderecoTO enderDest;
    @Element(elementName = "IE", publicName = "Incrição Estadual", type = TypeEnum.CARACTER, max = 14, formart = "ISENTO|[0-9]{0,14}")
    private String ie;
    @Element(elementName = "ISUF", publicName = "Incrição na SUFRAMA", type = TypeEnum.CARACTER, min = 8, max = 9, required = false, formart = "[0-9]{8,9}")
    private String iSUF;
    @Element(elementName = "email", publicName = "Email", type = TypeEnum.CARACTER, min = 1, max = 60, required = false)
    private String email;

    /**
     * CNPJ do destinatário.
     */
    public String getCNPJ() {
        return cnpj;
    }

    /**
     * Informar o CNPJ do destinatário.
     * <p><b>Não informar o conteúdo do campo se a operação for realizada com o exterior.</b></p>
     * <p><i>O CNPJ deve ser informado com os zeros não significativos.</i></p>
     * @param cnpj CNPJ do destinatário
     */
    public void setCNPJ(String cnpj) {
        this.cnpj = cnpj;
    }

    /**
     * CPF do destinatário.
     */
    public String getCPF() {
        return cpf;
    }

    /**
     * Informar o CPF do emitente.
     * <p><b>Não informar o conteúdo do campo se a operação for realizada com o exterior.</b></p>
     * <p><i>O CPF deve ser informado com os zeros não significativos.</i></p>
     * @param cpf CPF do destinatário
     */
    public void setCPF(String cpf) {
        this.cpf = cpf;
    }

    /**
     * Razão Social ou Nome.
     */
    public String getXNome() {
        return xNome;
    }

    /**
     * Informar a razão social ou nome do destinatário.
     * @param xNome Razão Social ou Nome
     */
    public void setXNome(String xNome) {
        this.xNome = xNome;
    }

    /**
     * Incrição Estadual.
     */
    public String getIE() {
        return ie;
    }

    /**
     * Informar a incrição estadual do destinatário.
     * <b><p>Informar a IE qando o destinatário for contribuinte do ICMS.</p>
     * <p>Informar"<b>ISENTO</b>" quando o destinatário for contribuinte do ICMS, mas não estiver obrigado
     * à inscrição no cadastro de contribuintes do ICMS.</p>
     * <p>Informar "" (vazio) se o destinatário não for contribuinte do ICMS.</p></b>
     * <p><i>A IE deve ser informada apenas com algarismos para destinatários contribuintes do ICMS, sem 
     * caracteres de formatação (ponto, barra, hífen, etc).</i></p>
     * @param ie Incrição Estadual
     */
    public void setIE(String ie) {
        this.ie = ie;
    }

    /**
     * Endereço.
     */
    public EnderecoTO getEnderDest() {
        return enderDest;
    }

    /**
     * Informar o grupo de informações de endereço do destinatário.
     * @param enderDest Endereço
     */
    public void setEnderDest(EnderecoTO enderDest) {
        this.enderDest = enderDest;
    }

    /**
     * Inscrição SUFRAMA.
     */
    public String getISUF() {
        return iSUF;
    }

    /**
     * Informar a inscrição na SUFRAMA.
     * <p><b>Obrigatório, nas operações que se beneficiam de incentivos fiscais existentes nas áreas
     * sob controle da SUFRAMA.
     * <br>A omissão da inscrição SUFRAMA impede o processamento da operação pelo sistema de mercdoria nacional
     * da SUFRAMA e a liberação da declaração de ingresso, prejudicando a comprovação do ingresso/internamento da
     * mercadoria nas áreas sob controle da SUFRAMA.</b></p>
     * @param iSUF Inscrição SUFRAMA
     */
    public void setISUF(String iSUF) {
        this.iSUF = iSUF;
    }

    /**
     * Email.
     */
    public String getEmail() {
        return email;
    }

    /**
     * Informar o email do destinatário.
     * <p><i>O campo pode ser utilizado para informar o e-mail de recepção da NF-e indicada pelo destinatário.</i></p>
     * @param email Email
     */
    public void setEmail(String email) {
        this.email = email;
    }
}
